Collection 裡的元素一放多了,就免不了要在裡面找東西。跟過濾一樣,搜尋也是很常見的的需求,在這個章節裡就要跟大家討論一下 Collection 的搜尋功能。
find()
可以幫我們找出 Collection 裡第一個符合條件的元素,假如沒有任何元素符合的話,就會回傳 null。咦?是不是覺得跟 filter()
功能很像?其實不然,我們用 IntelliJ IDEA 把回傳 Type 顯示出來就可以知道差異。find()
回傳的是 T?
,也就是只有一個元素,找不到就是 null;而 filter()
回傳的是 List<T>
,也就是多個元素,沒有符合的話就是空 List。記得要依照不同的情境,選擇合適的 method。
val words = listOf("Lets", "find", "something", "in", "collection", "somehow")
val firstSome = words.find { it.startsWith("some") } // something
val filterSome = words.filter { it.startsWith("s") } // [something, somehow]
與 find()
動作相同但方向相反,findLast()
則是從 Collection 的後面開始往前搜尋找出第一個符合條件的元素,假如沒有任何元素符合的話,就會回傳 null。
val words = listOf("Lets", "find", "something", "in", "collection", "somehow")
val last = words.findLast { it.startsWith("some") } // somehow
與 find
開頭的搜尋 method 不同,以 index
開頭的幾個搜尋 method 在搜尋後是回傳元素所在的 index,在不同情境下可以使用。indexOf()
會回傳第一個符合搜尋元素的 index;indexOfFirst()
及 indexOfLast()
則是可以傳入一個 Lambda 當條件,從 Collection 的前面或後面開始搜尋,並回傳第一個符合條件的 index。這三個 method 若是搜尋不到結果的話,都會回傳 -1。
val words = arrayOf("Lets", "find", "something", "in", "collection", "somehow")
val index = words.indexOf("some") // -1
val indexOfFirst = words.indexOfFirst { it.contains("some") } // 2
val indexOfLast = words.indexOfLast { it.contains("some") } // 5
這個章節討論幾個常用的檢查操作,這些 method 可以省下許多手動處理的動作。同樣地,為了一覽這些 API 在不同 Collection 上的行為,以下用表格來整理本章所討論到的 method:
行為 | Array | List | Set | Map | |
---|---|---|---|---|---|
find{} | 從頭搜尋元素 | v | v | v | x |
findLast{} | 從尾搜尋元素 | v | v | v | x |
indexOf() | 搜尋元素後回傳 index | v | v | v | x |
indexOfFist{} | 從頭搜尋元素後回傳 index | v | v | v | x |
indexOfLast{} | 從尾搜尋元素後回傳 index | v | v | v | x |
val filterSome = words.filter { it.startsWith("x") } // [something, somehow]
似乎是 it.startsWith("s")
Hi 對,當時筆誤,已修正,感謝提醒!
更完整的說明及範例可以參考我後來重新撰寫的《Kotlin Collection 全方位解析攻略 》 https://www.tenlong.com.tw/products/9786263331136